﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data.Linq;
using System.Linq;
using System.Net.Mail;
using System.Transactions;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using ShopNet.Model;

namespace ShopNet
{
    public partial class CheckoutStep2 : System.Web.UI.Page
    {
        private TiposPagamento tipoPgto = TiposPagamento.PagSeguro;

        #region Propriedades

        public new Shop Master
        {
            get
            {
                return ((Shop)(base.Master));
            }
        }

        protected IList<ProdutoCarrinho> Cesta
        {
            get
            {
                if (Session["cesta"] == null) Session.Add("cesta", new List<ProdutoCarrinho>());
                return (IList<ProdutoCarrinho>)Session["cesta"];
            }
            set { if (value != null) Session.Add("cesta", value); }
        }

        private Usuario Us
        {
            get
            {
                MembershipUser user = Membership.GetUser();
                Usuario us = NServico.Db.Usuarios.FirstOrDefault(u => u.UserId == user.UserName);
                return us;
            }
        }

        private int IdEndereco
        {
            get
            {
                if (Session["IdEndereco"] == null) Response.Redirect("~/Checkout/CheckoutVerifier.aspx");
                return int.Parse(Session["IdEndereco"].ToString());
            }
        }

        #endregion

        #region Metodos

        private void CriarPedido()
        {
            Endereco endereco = NServico.Db.Enderecos.FirstOrDefault(e => e.IdEndereco == IdEndereco);

            using (var tScope = new TransactionScope(TransactionScopeOption.Required))
            {
             
                #region Pedido

                Pedido pedido = new Pedido
                                    {
                                        UniqIdPedido = Guid.NewGuid(),
                                        status = StatusPedido.AguardandoPagamento.GetHashCode(),
                                        DataStatus = DateTime.Now,
                                        IdUsuario = Us.IdUsuario,
                                        Endereco = endereco.Endereco1,
                                        Bairro = endereco.Bairro,
                                        Complemento = endereco.Complemento,
                                        Data = DateTime.Now,
                                        IdCidade = endereco.IdCidade,
                                        Numero = endereco.Numero,
                                        TipoPagamento = tipoPgto.GetHashCode()
                                    };

                NServico.Db.Pedidos.InsertOnSubmit(pedido);
                NServico.Db.SubmitChanges(ConflictMode.FailOnFirstConflict);
#if DEBUG
                pagSeguroVenda.UrlPagSeguro = @"http://localhost:9090/checkout/checkout.jhtml";
                //URL de Retorno http://localhost:9090/pagseguro-ws/checkout/NPI.jhtml
#endif
                pagSeguroVenda.CodigoReferencia = pedido.IdPedido.ToString();
                pagSeguroVenda.Cliente = new UOL.PagSeguro.Cliente
                                             {
                                                 Bairro = endereco.Bairro,
                                                 Cep = endereco.Cep,
                                                 Cidade = endereco.Cidade.Nome,
                                                 ComplementoEndereco = endereco.Complemento,
                                                 DDD = Convert.ToInt32(Us.Ddd),
                                                 Email = Us.UsuarioLogado.Email,
                                                 Endereco = endereco.Endereco1,
                                                 Nome = Us.Nome,
                                                 Numero = endereco.Numero,
                                                 Pais = "Brasil",
                                                 Telefone = Convert.ToInt32(Us.Telefone),
                                                 Uf = endereco.Cidade.Uf.Sigla
                                             };

                #endregion

                #region Itens Pedidos

                int contator = 1;
                foreach (ProdutoCarrinho pc in Cesta)
                {
                    Produto prod = NServico.Db.Produtos.FirstOrDefault(p => p.IdProduto == pc.IdProduto);
                    ItemPedido ip = new ItemPedido
                                        {
                                            IdItemPedido = contator,
                                            IdPedido = pedido.IdPedido,
                                            IdProduto = prod.IdProduto,
                                            Preco = prod.precoDesconto,
                                            Quantidade = pc.QtdeProduto
                                        };
                    contator++;
                    NServico.Db.ItemPedidos.InsertOnSubmit(ip);
                    UOL.PagSeguro.Produto psProduto = new UOL.PagSeguro.Produto
                                                    {
                                                        Codigo = prod.IdProduto.ToString(),
                                                        Descricao = string.Format("{0} - {1}", prod.Nome, prod.Descricao),
                                                        Quantidade = pc.QtdeProduto,
                                                        Valor = (double) prod.precoDesconto
                                                    };
                    pagSeguroVenda.Produtos.Add(psProduto);
                    
                    bool disponivel = prod.IsDisponivel;

                    if (!prod.IsDisponivel)
                    {
                        Master.ExibirMensagem(Shop.TipoMensagem.Error, string.Format("Produto {0} Indisponível.", prod.Nome));
                        tScope.Dispose();
                        return;
                    }

                    //prod.QuantidadeEstoque = prod.QuantidadeEstoque - pc.QtdeProduto;
                    prod.QtdeEstoque = prod.QtdeEstoque - pc.QtdeProduto;

                    
                    NServico.Db.SubmitChanges(ConflictMode.FailOnFirstConflict);
                    
                }

                #endregion

                Session.Remove("cesta");
                Session.Remove("IdEndereco");
                Session.Remove("UniqIdPedido");
                Session.Add("UniqIdPedido", pedido.IdPedido);

                tScope.Complete();
            }   

        }

        #endregion


        #region Eventos

        #region Page_Load

        protected void Page_Load(object sender, EventArgs e)
        {
            Master.ExibirMensagem(Shop.TipoMensagem.Success, string.Empty);
            MembershipUser usuario = Membership.GetUser();

            //if (HttpContext.Current.User.Identity.IsAuthenticated)
            if (usuario == null)
                Response.Redirect("~/Checkout/CheckoutVerifier.aspx", true);

            if (Cesta.Count() == 0)
                Response.Redirect("~/Cesta.aspx", true);

        }

        #endregion
        
        #region bFinalizar_Click

        protected void bFinalizar_Click(object sender, EventArgs e)
        {
            if (!rbBb.Checked && !rbBradesco.Checked && !rbItau.Checked)
            {
                Master.ExibirMensagem(Shop.TipoMensagem.Error, "Selecione uma forma de pagamento");
                return;
            }
            if (rbBb.Checked)
                tipoPgto = TiposPagamento.BancoBrasil;
            if (rbBradesco.Checked)
                tipoPgto = TiposPagamento.Bradesco;
            if (rbItau.Checked)
                tipoPgto = TiposPagamento.Itau;

            CriarPedido();
            Response.Redirect("~/FimCompra.aspx", true);
        }

        #endregion

        protected void ibPagSeguro_Click(object sender, ImageClickEventArgs e)
        {
            CriarPedido();

            pagSeguroVenda.Executar(Response);

        }
        
        #endregion

    }
}